﻿using System;
using System.Configuration;
using System.Drawing;
using System.Web.UI.HtmlControls;
using Metodesa.Logic;
using METODESA.Server.Data.Exceptions;
using Metodesa.Tools;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Nhibernate;

namespace Metodesa.Views.Home
{
    public partial class DetailsVenta : System.Web.UI.Page
    {
        public HtmlTable table;
        public static bool first;
        protected void Page_Load(object sender, EventArgs e)
        {
            first = false;
            if (Session["User"] != null)
            {
                Empleado usuario = (Empleado)Session["User"];
                
            }
            else
            {
                Response.Redirect("../../Views/Home/Index.aspx", true);
            }
            int ids = -1;
            OrdenVenta venta;
            if (Id.Value == null || Id.Value == "")
            {
                if (!int.TryParse(Request.QueryString.Get("id"), out ids))
                    Response.Redirect("../../Views/Home/ListCompra.aspx", true);
                Id.Value = ids.ToString();
                first = true;

            }
            else
            {
                ids = int.Parse(Id.Value);

            }
            string action = Request.QueryString.Get("a");
            if (action == "d")
            {
                int detalleId;
                if (int.TryParse(Request.QueryString.Get("det"), out detalleId)) ;
                    deleteDetalle(detalleId);
            }

            venta = VentasDao.getVentaById(ids);
            if (venta == null)
                Response.Redirect("../../Views/Home/ListCompra.aspx", true);
            else
            {

                preparePage(venta);
            }

        }

        private void deleteDetalle(int idDetalle)
        {
            try
            {
                VentaLogic.deleteDetalle(int.Parse(Id.Value), idDetalle);
            }
            #region manejo de errores
            catch (EntityCouldntBeUpdated exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo borrar el detalle";
                PanelAdd.Visible = true;
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        private void preparePage(OrdenVenta venta)
        {
           
            labelCodigo.Text = venta.Id.ToString();
            labelEmpleado.Text = venta.Empleado.Nombre + " " + venta.Empleado.Apellido;
            labelMonto.Text = venta.Monto.ToString();
            labelClienteNombre.Text = venta.Cliente.Nombre + " " + venta.Cliente.Apellido;
            labelClienteCedula.Text = venta.Cliente.CedulaRif;
            labelPago.Text = venta.TipoPago;
            double impuesto;
            impuesto = double.Parse(ConfigurationSettings.AppSettings["Impuesto"])*100;
            labelTotal.Text = (venta.Monto + Math.Round(venta.Monto * impuesto/100)).ToString();
            labelImpuesto.Text = impuesto+"%";
            bool closed = venta.Estado == 1;
            PanelAdd.Visible = !closed; // Si no esta cerrado el panel es visible
            ButtonCerrar.Visible = !closed;
            PanelImprimir.Visible = closed;
           
            
            table = VentasTools.ListDetalleVenta(venta.detalleVenta, venta.Id, closed);
            ListDetalles.Controls.Clear();
            if (table != null)
                ListDetalles.Controls.Add(table);
            if(ListCategory.Items.Count==0) // tengo que cargar la lista de categorias
            {
                ListCategory = ProductosTools.ListCategoria(ListCategory);   
            }
            if (ListCategory.SelectedItem==null)
            {
                DropDownListProductos.Enabled = false;
                DropDownListProductos.Items.Clear();
                labelPrecioTotal.Text = "0";

                LabelPrecioR.Text = "";
                textCantidad.Text = "0";
                textCantidad.Enabled = false;
                textPorcent.Text = "";
                textPorcent.Enabled = false;
                textPrecio.Text = "0";
                textPrecio.Enabled = false;
            }
            else
            {
                if(DropDownListProductos.Items.Count==0)
                {

                    
                    DropDownListProductos = ProductosTools.addProductosCategorias(DropDownListProductos,ListCategory.Items);
                    DropDownListProductos.Enabled = true;

                }
                int id = int.Parse(DropDownListProductos.SelectedValue);
                Producto producto = ProductoDao.getProductoById(id);
                LabelPrecioR.Text = producto.Precio.ToString();
                textCantidad.Enabled = true;
                textPorcent.Enabled = true;
            }
               
                
        }

        protected void ListCategory_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownListProductos.Items.Clear();
            DropDownListProductos = ProductosTools.addProductosCategorias(DropDownListProductos, ListCategory.Items);
            DropDownListProductos.Enabled = true;
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);
            LabelPrecioR.Text = producto.Precio.ToString();
            textCantidad.Enabled = true;
            textPorcent.Enabled = true;
            textPrecio.Enabled = true;
        }

        protected void DropDownListProductos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);
            LabelPrecioR.Text = producto.Precio.ToString();
            textCantidad.Enabled = true;
            textPorcent.Enabled = true;
            textPrecio.Enabled = true;

            int cantidad=-1;
            double precio=-1;
            int porcentaje = -1;
            if (int.TryParse(textCantidad.Text, out cantidad) && double.TryParse(textPrecio.Text, out precio))
                labelPrecioTotal.Text = (cantidad * precio).ToString();
            else
            {
                textCantidad.Text = "0";
                labelPrecioTotal.Text = "0";
            }

            if (double.TryParse(textPrecio.Text, out precio))
            {
                double resultado=(precio/producto.Precio)
                *100;
                textPorcent.Text = (resultado.ToString());
                if (resultado >= 100)
                    textPorcent.ForeColor = Color.Green;
                else
                    textPorcent.ForeColor = Color.Red;

            }
            else
            {
                if (int.TryParse(textPorcent.Text, out porcentaje))
                {
                    textPrecio.Text = (porcentaje*producto.Precio).ToString();

                }
            }


            
        }

        protected void textCantidad_TextChanged(object sender, EventArgs e)
        {
            int id = int.Parse(DropDownListProductos.SelectedValue);
            double precio;
            int cantidad;
            if (!double.TryParse(textPrecio.Text, out precio))
                precio = 0;

            if (int.TryParse(textCantidad.Text, out cantidad))
                labelPrecioTotal.Text = (cantidad * precio).ToString();
            else
            {
                textCantidad.Text = "0";
                labelPrecioTotal.Text = "0";

            }
        }

        protected void textPorcent_TextChanged(object sender, EventArgs e)
        {
            int cantidad;
            double porcentaje;
            double result; 
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);

            if (double.TryParse(textPorcent.Text, out porcentaje))
            {
                
                if (porcentaje >= 100)
                    textPorcent.ForeColor = Color.Green;
                else
                    textPorcent.ForeColor = Color.Red;
                
                result = (porcentaje*producto.Precio)/100;
                textPrecio.Text = (Math.Round(result, 3)).ToString();
                if (int.TryParse(textCantidad.Text, out cantidad))
                    labelPrecioTotal.Text = (Math.Round(cantidad * result, 3)).ToString();
                else
                {
                    textCantidad.Text = "0";
                    labelPrecioTotal.Text = "0";

                }

            }
            else
            {
                textPorcent.Text = "";
            }

        }

        protected void textPrecio_TextChanged(object sender, EventArgs e)
        {
            int cantidad;
            double porcentaje;
            double result;
            int id = int.Parse(DropDownListProductos.SelectedValue);
            Producto producto = ProductoDao.getProductoById(id);

            if (double.TryParse(textPrecio.Text, out result))
            {
                
                porcentaje = (result / producto.Precio)*100;
                textPrecio.Text = (Math.Round(result,3) ).ToString();

                textPorcent.Text = Math.Round(porcentaje,3).ToString();
                if (porcentaje >= 100)
                    textPorcent.ForeColor = Color.Green;
                else
                    textPorcent.ForeColor = Color.Red;

                if (int.TryParse(textCantidad.Text, out cantidad))
                    labelPrecioTotal.Text = (Math.Round(cantidad*result, 3)).ToString();
                else
                {
                    textCantidad.Text = "0";
                    labelPrecioTotal.Text = "0";

                }

            }
            else
            {
                textPorcent.Text = "";
            }

        }

        protected void addButton_Click(object sender, EventArgs e)
        {
            int idProducto = int.Parse(DropDownListProductos.SelectedValue);
            double monto;

            if(textCantidad.Text=="0")
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pueden Agregar 0 productos";
                
                return;
            }
           
            try
            {
                DetalleVenta detalle = VentaLogic.AddDetalleVenta(idProducto, Id.Value, textCantidad.Text, textPrecio.Text, out monto);
                if (detalle != null)
                {

                    bool closed = detalle.OrdenVenta.Estado == 1;
                    table = VentasTools.ConcatListDetalleVenta(detalle, table, int.Parse(Id.Value), closed);
                    double impuesto = double.Parse(ConfigurationSettings.AppSettings["Impuesto"]);
                    labelTotal.Text = (monto + Math.Round(monto * impuesto)).ToString();
                    labelMonto.Text = monto.ToString();
                }
            }
            #region manejo de errores
            catch (EntityCouldntBeSaved exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo agregar el detalle";
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        protected void ButtonCerrar_Click(object sender, EventArgs e)
        {
            try
            {
                OrdenVenta venta = VentaLogic.Close(Id.Value);
                ButtonCerrar.Visible = false;
                PanelAdd.Visible = false;
                PanelImprimir.Visible = true;
                bool closed = venta.Estado == 1;
                table = VentasTools.ListDetalleVenta(venta.detalleVenta, venta.Id, closed);
                ListDetalles.Controls.Clear();
                if (table != null)
                    ListDetalles.Controls.Add(table);
            }
            #region manejo de errores
            catch (EntityCouldntBeUpdated exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo cerrar la venta";
                Session.Add("Error", exception);
            }

            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        

    }
}
